package com.zxy.ziems.server.device.service;

import com.zxy.btp.common.response.PageResult;
import com.zxy.ziems.server.device.controller.DeviceTreeVO;
import com.zxy.ziems.server.device.pojo.dto.BatchAddDevicePropertyDTO;
import com.zxy.ziems.server.device.pojo.dto.DeviceBaseDTO;
import com.zxy.ziems.server.device.pojo.dto.DeviceDTO;
import com.zxy.ziems.server.device.pojo.entity.DeviceEntity;
import com.zxy.ziems.server.device.pojo.param.DeviceQueryParam;
import com.zxy.ziems.server.device.pojo.vo.DeviceAlarmVO;
import com.zxy.ziems.server.device.pojo.vo.DeviceVO;
import com.zxy.ziems.server.device.pojo.vo.SceneDeviceAlarmCountVO;
import com.zxy.ziems.server.scene.pojo.param.SceneTreeParam;
import com.zxy.ziems.server.scene.pojo.vo.SceneTreeAlarmVO;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Set;

/**
 * 设备抽象
 *
 * @author chdzq
 * @create 2023/3/22
 */
public interface DeviceService {
    /**
     * 增加
     *
     * @param dto
     */
    void add(DeviceDTO<?> dto);

    /**
     * 批量添加
     *
     * @param entityList
     * @return
     */
    boolean saveBatch(Collection<DeviceEntity> entityList);

    /**
     * 添加设备，存在则不添加
     *
     * @param deviceEntity
     * @return
     */
    String saveEntity(DeviceEntity deviceEntity);

    /**
     * 更新
     */
    void update(DeviceDTO<?> dto);

    /**
     * 删除
     *
     * @param id
     */
    void deleteById(String id);

    /**
     * 更新
     *
     * @param entity
     */
    void updateBy(DeviceEntity entity);

    /**
     * 获取DO
     *
     * @param id
     * @return
     */
    DeviceEntity getById(String id);

    /**
     * 获取DO
     *
     * @param code code
     * @param type 类型
     * @return
     */
    DeviceEntity getByCode(String code, String type);


    /**
     * 获取DO列表
     *
     * @param ids
     * @return
     */
    List<DeviceEntity> listByIdList(Collection<? extends Serializable> ids);

    /**
     * 获取DO列表
     *
     * @param type 设备类型code
     * @param name 设备名称
     * @return
     */
    List<DeviceVO<Object>> listByCodeList(String type, String name);


    /**
     * 获取展示信息
     *
     * @param id
     * @return
     */
    DeviceVO<Object> viewById(String id);

    /**
     * 分页查询
     *
     * @param param 分页查询参数
     * @return
     */
    PageResult<DeviceVO<Object>> pageListBy(DeviceQueryParam param);


    List<DeviceEntity> list();

    /**
     * 设备树
     *
     * @return
     */
    List<DeviceTreeVO> tree();

    List<DeviceAlarmVO> listAddressAndAlarm(String sentId, List<String> typeCode);


    /**
     * 批量替换
     *
     * @param deviceList
     * @param deviceType
     */
    void batchSaveOrUpdate(List<DeviceEntity> deviceList, String deviceType);

    void saveOrUpdateById(List<DeviceEntity> deviceList);

    List<SceneDeviceAlarmCountVO> countDeviceAlarm(List<String> typeCode);

    /**
     * 根据编码获取设备，找不到则添加
     *
     * @param code
     * @param type
     * @return
     */
    DeviceEntity getByCodeAndAdd(String code, String type);

    void updateAlarmStatus(String deviceId, Integer alarmStatus);

    List<SceneTreeAlarmVO> getAlarmTreeBy(SceneTreeParam param);

    /**
     * 根据设备分类获取设备
     *
     * @param typeCode
     * @return
     */
    List<DeviceEntity> listByTypeCode(String typeCode);

    /**
     * 通过id集获取设备数据，包括逻辑删除数据
     *
     * @param deviceIdSet
     * @return
     */
    List<DeviceEntity> listByIdListAndDelete(Set<String> deviceIdSet);

    /**
     * 通过id集获取设备数据，包括逻辑删除数据
     *
     * @param deviceCodeSet
     * @return
     */
    List<DeviceEntity> listByCodeListAndDelete(Set<String> deviceCodeSet);

    String addBase(DeviceBaseDTO<Object> dto);

    /**
     * 初始电力设备
     */
    void initDlDevice();

    /**
     * 批量创建设备及属性
     * @param dto
     */
    void batchAddDevice(BatchAddDevicePropertyDTO dto);
}
